// vwapStrategies.js - 存放VWAP策略相关函数

// 计算VWAP (成交量加权平均价格) - 优化版
// VWAP计算方式：
// 1. 典型价格 = (最高价 + 最低价 + 收盘价) / 3
// 2. 累积(典型价格 * 成交量) / 累积成交量
// 数据获取方式：从K线数据中获取high, low, close, volume字段
export const calculateVWAP = (data) => {
  try {
    // 参数验证
    if (!data || !Array.isArray(data) || data.length === 0) {
      console.warn('VWAP计算失败：输入数据为空或无效')
      return []
    }
    
    const vwap = []
    let cumulativePriceVolume = 0
    let cumulativeVolume = 0
    
    console.log(`开始计算VWAP，输入数据共${data.length}条`)
    
    for (let i = 0; i < data.length; i++) {
      // 检查数据完整性
      if (data[i] === null || data[i] === undefined) {
        console.warn(`VWAP计算警告：数据索引${i}处的数据为空`)
        continue
      }
      
      // 检查必要字段是否存在
      if (data[i].high === undefined || data[i].low === undefined || 
          data[i].close === undefined || data[i].volume === undefined) {
        console.warn(`VWAP计算警告：数据索引${i}缺少必要字段 (high, low, close, volume)`)
        continue
      }
      
      // 检查数据类型
      if (typeof data[i].high !== 'number' || typeof data[i].low !== 'number' || 
          typeof data[i].close !== 'number' || typeof data[i].volume !== 'number') {
        console.warn(`VWAP计算警告：数据索引${i}的字段类型不正确`)
        continue
      }
      
      // 计算典型价格 (典型价格 = (最高价 + 最低价 + 收盘价) / 3)
      // 典型价格代表了该K线周期内的平均价格水平
      const typicalPrice = (data[i].high + data[i].low + data[i].close) / 3
      
      // 检查典型价格计算结果
      if (!isFinite(typicalPrice)) {
        console.warn(`VWAP计算警告：索引${i}处的典型价格计算结果无效`)
        continue
      }
      
      // 获取成交量数据，如果成交量为0则设为1防止除零错误
      // 成交量反映了该周期内交易的活跃程度
      const volume = data[i].volume || 1
      
      // 累积价格*成交量和成交量
      // 价格*成交量表示该周期内的总交易价值
      cumulativePriceVolume += typicalPrice * volume
      cumulativeVolume += volume
      
      // 计算当前VWAP值
      // VWAP = 累积(典型价格 * 成交量) / 累积成交量
      if (cumulativeVolume > 0) {
        const vwapValue = cumulativePriceVolume / cumulativeVolume
        if (isFinite(vwapValue)) {
          vwap.push(vwapValue)
          // 打印每次计算的VWAP参数
          console.log(`VWAP计算[${i}] - 典型价格: ${typicalPrice.toFixed(4)}, 成交量: ${volume}, 累积价格*成交量: ${cumulativePriceVolume.toFixed(4)}, 累积成交量: ${cumulativeVolume}, VWAP: ${vwapValue.toFixed(4)}`)
        } else {
          console.warn(`VWAP计算警告：索引${i}处计算出的VWAP值无效`)
          vwap.push(typicalPrice)
        }
      } else {
        vwap.push(typicalPrice)
        // 打印每次计算的VWAP参数
        console.log(`VWAP计算[${i}] - 典型价格: ${typicalPrice.toFixed(4)}, 成交量: ${volume}, 累积价格*成交量: ${cumulativePriceVolume.toFixed(4)}, 累积成交量: ${cumulativeVolume}, VWAP: ${typicalPrice.toFixed(4)}(使用典型价格)`)
      }
    }
    
    // 输出计算结果信息
    console.log(`VWAP计算完成：输入数据${data.length}条，有效计算${vwap.length}条`)
    
    return vwap
  } catch (error) {
    console.error('VWAP计算过程中发生错误：', error)
    return []
  }
}

// 实时VWAP信号生成（优化版）
// 基于真实的K线数据生成VWAP交易信号
export const generateRealTimeVWAPSignal = (priceHistory, position) => {
  try {
    // 参数验证
    if (!priceHistory || !Array.isArray(priceHistory)) {
      console.warn('实时VWAP信号生成失败：价格历史数据无效')
      return null
    }
    
    if (priceHistory.length < 20) {
      console.log(`实时VWAP信号生成：价格历史数据不足，需要至少20条数据，当前${priceHistory.length}条`)
      return null
    }
    
    console.log(`开始生成实时VWAP信号，价格历史数据${priceHistory.length}条`)
    
    // 将价格历史转换为包含high, low, close, volume的数据格式
    // 使用真实的K线数据而不是模拟数据
    const data = priceHistory.map((p, index) => {
      // 检查数据完整性
      if (!p || p.close === undefined) {
        console.warn(`实时VWAP信号生成警告：价格历史索引${index}处数据无效`)
        return null
      }
      
      // 使用真实数据（如果可用）
      return {
        date: p.date,
        close: p.close,
        high: p.high || p.close * (1 + Math.random() * 0.01), // 如果没有真实high数据则模拟
        low: p.low || p.close * (1 - Math.random() * 0.01),   // 如果没有真实low数据则模拟
        volume: p.volume || (1000 + Math.random() * 1000)     // 如果没有真实volume数据则模拟
      }
    }).filter(item => item !== null) // 过滤掉无效数据
    
    // 检查转换后的数据
    if (data.length < 20) {
      console.warn(`实时VWAP信号生成：数据转换后有效数据不足，需要至少20条，当前${data.length}条`)
      return null
    }
    
    // 计算VWAP值
    console.log('开始计算VWAP值')
    const vwapValues = calculateVWAP(data)
    
    if (vwapValues.length < 2) {
      console.warn(`实时VWAP信号生成：VWAP计算结果不足，需要至少2条数据，当前${vwapValues.length}条`)
      return null
    }
    
    console.log(`VWAP计算完成，得到${vwapValues.length}条VWAP数据`)
    
    const currentPrice = data[data.length - 1].close
    const currentVWAP = vwapValues[vwapValues.length - 1]
    const prevVWAP = vwapValues[vwapValues.length - 2]
    
    // 打印VWAP参数
    console.log(`实时VWAP参数 - 当前价格: ${currentPrice.toFixed(4)}, 当前VWAP: ${currentVWAP.toFixed(4)}, 前一个VWAP: ${prevVWAP.toFixed(4)}`)
    
    // 检查数值有效性
    if (!isFinite(currentPrice) || !isFinite(currentVWAP) || !isFinite(prevVWAP)) {
      console.warn('实时VWAP信号生成：价格或VWAP值无效')
      return null
    }
    
    console.log(`当前价格: ${currentPrice}, 当前VWAP: ${currentVWAP}, 前一个VWAP: ${prevVWAP}`)
    console.log(`当前持仓状态: ${position}`)
    
    // VWAP交易信号生成
    // 买入条件：价格上穿VWAP且当前无持仓
    // 上穿条件：currentPrice > currentVWAP（当前价格高于VWAP）
    // 趋势确认：prevVWAP >= currentVWAP（VWAP线趋于平缓或向下，价格向上突破）
    if (currentPrice > currentVWAP && prevVWAP >= currentVWAP && position === 0) {
      console.log('生成买入信号：价格上穿VWAP')
      return { 
        type: 'buy', 
        reason: '价格上穿VWAP' 
      }
    }
    
    // 卖出条件：价格下穿VWAP且当前有持仓
    // 下穿条件：currentPrice < currentVWAP（当前价格低于VWAP）
    // 趋势确认：prevVWAP <= currentVWAP（VWAP线趋于平缓或向上，价格向下突破）
    if (currentPrice < currentVWAP && prevVWAP <= currentVWAP && position > 0) {
      console.log('生成卖出信号：价格下穿VWAP')
      return { 
        type: 'sell', 
        reason: '价格下穿VWAP' 
      }
    }
    
    console.log('未生成交易信号')
    return null
  } catch (error) {
    console.error('实时VWAP信号生成过程中发生错误：', error)
    return null
  }
}

// 历史数据VWAP信号生成
// 根据历史K线数据生成VWAP交易信号
// 与实时VWAP信号生成类似，但使用真实的历史K线数据（包含high, low, close, volume）
// 
// VWAP信号生成逻辑：
// 1. 买入信号：当前价格上穿VWAP线 且 前一个VWAP值大于等于当前VWAP值 且 当前无持仓
// 2. 卖出信号：当前价格下穿VWAP线 且 前一个VWAP值小于等于当前VWAP值 且 当前有持仓
export const generateVWAPSignal = (data, currentIndex, position) => {
  try {
    // 参数验证
    if (!data || !Array.isArray(data)) {
      console.warn('历史VWAP信号生成失败：输入数据无效')
      return null
    }
    
    if (currentIndex === undefined || currentIndex < 0 || currentIndex >= data.length) {
      console.warn(`历史VWAP信号生成失败：索引无效，当前索引${currentIndex}，数据长度${data.length}`)
      return null
    }
    
    if (currentIndex < 20) {
      console.log(`历史VWAP信号生成：索引不足，需要至少20，当前${currentIndex}`)
      return null
    }
    
    console.log(`开始生成历史VWAP信号，数据长度${data.length}，当前索引${currentIndex}`)
    
    // 打印当前数据点的参数
    const currentDataPoint = data[currentIndex]
    console.log(`当前数据点[${currentIndex}] - 日期: ${currentDataPoint.date}, 开盘价: ${currentDataPoint.open}, 最高价: ${currentDataPoint.high}, 最低价: ${currentDataPoint.low}, 收盘价: ${currentDataPoint.close}, 成交量: ${currentDataPoint.volume}`)
    
    // 计算到当前索引为止的VWAP
    // 使用从数据开始到当前索引的所有数据来计算VWAP，确保信号的准确性
    const relevantData = data.slice(0, currentIndex + 1)
    console.log(`截取相关数据：从0到${currentIndex}，共${relevantData.length}条`)
    
    const vwapValues = calculateVWAP(relevantData)
    
    if (vwapValues.length < 2) {
      console.warn(`历史VWAP信号生成：VWAP计算结果不足，需要至少2条数据，当前${vwapValues.length}条`)
      return null
    }
    
    console.log(`VWAP计算完成，得到${vwapValues.length}条VWAP数据`)
    
    // 检查当前数据点
    if (!data[currentIndex] || data[currentIndex].close === undefined) {
      console.warn(`历史VWAP信号生成：索引${currentIndex}处的数据无效`)
      return null
    }
    
    const currentPrice = data[currentIndex].close
    const currentVWAP = vwapValues[vwapValues.length - 1]
    const prevVWAP = vwapValues[vwapValues.length - 2]
    
    // 打印VWAP参数
    console.log(`历史VWAP参数 - 当前价格: ${currentPrice.toFixed(4)}, 当前VWAP: ${currentVWAP.toFixed(4)}, 前一个VWAP: ${prevVWAP.toFixed(4)}`)
    
    // 检查数值有效性
    if (!isFinite(currentPrice) || !isFinite(currentVWAP) || !isFinite(prevVWAP)) {
      console.warn('历史VWAP信号生成：价格或VWAP值无效')
      return null
    }
    
    console.log(`当前价格: ${currentPrice}, 当前VWAP: ${currentVWAP}, 前一个VWAP: ${prevVWAP}`)
    console.log(`当前持仓状态: ${position}`)
    
    // VWAP交易信号
    // 买入条件：价格上穿VWAP且当前无持仓
    if (currentPrice > currentVWAP && prevVWAP >= currentVWAP && position === 0) {
      console.log('生成买入信号：价格上穿VWAP')
      return { 
        type: 'buy', 
        reason: '价格上穿VWAP' 
      }
    }
    
    // 卖出条件：价格下穿VWAP且当前有持仓
    if (currentPrice < currentVWAP && prevVWAP <= currentVWAP && position > 0) {
      console.log('生成卖出信号：价格下穿VWAP')
      return { 
        type: 'sell', 
        reason: '价格下穿VWAP' 
      }
    }
    
    console.log('未生成交易信号')
    return null
  } catch (error) {
    console.error('历史VWAP信号生成过程中发生错误：', error)
    return null
  }
}